﻿using System.Linq;
using WindMill.Models.Cadastro;
using WindMill.Services;
using System.ComponentModel;


namespace WindMill.Models.Controladoria
{
    public partial class Filial : INotifyPropertyChanged, INotifyPropertyChanging
    {
        private Cidade _cidade = null;

        public Cidade Cidade {
            get
            {
                if (CodCidade == null)
                    return null;

                if (_cidade == null || _cidade.Id != CodCidade)
                {
                    var context = (EDMCadastro)OracleConnectionPool.GetPool().GetDbContext<EDMCadastro>();
                    _cidade = context.Cidades.SingleOrDefault(c => c.Id == CodCidade);
                }

                return _cidade;
            }
            set
            {
                OnPropertyChanging("Cidade");
                _cidade = value;
                CodCidade = value != null ? value.Id : (int?) null;
                OnPropertyChanged("Cidade");
            }


        }

        private Estado _estado = null;

        public Estado Estado
        {
            get
            {
                if (CodEstado == null)
                    return null;

                if (_estado == null || _estado.Id != CodEstado)
                {
                    var context = (EDMCadastro)OracleConnectionPool.GetPool().GetDbContext<EDMCadastro>();
                    _estado = context.Estados.SingleOrDefault(c => c.Id == CodEstado);
                }

                return _estado;
            }
            set
            {
                OnPropertyChanging("Estado");
                _estado = value;
                CodEstado = value != null ? value.Id : null;
                OnPropertyChanged("Estado");
            }
        }

        private Pessoa _cadastro = null;

        public Pessoa Cadastro
        {
            get
            {
                if (CodCadastro == null)
                    return null;

                if (_cadastro == null || _cadastro.Id != CodCadastro)
                {
                    var context = (EDMCadastro)OracleConnectionPool.GetPool().GetDbContext<EDMCadastro>();
                    _cadastro = context.Pessoas.SingleOrDefault(c => c.Id == CodCadastro);
                }

                return _cadastro;
            }
            set
            {                
                OnPropertyChanging("Cadastro");
                _cadastro = value;
                CodCadastro = value != null ? value.Id : (int?)null;
                OnPropertyChanged("Cadastro");
            }
        }

        private Pessoa _contabilista = null;

        public Pessoa CadContabilista
        {
            get
            {
                if (CodCadastroContabilista == null)
                    return null;

                if (_contabilista == null || _contabilista.Id != CodCadastroContabilista)
                {
                    var context = (EDMCadastro)OracleConnectionPool.GetPool().GetDbContext<EDMCadastro>();
                    _contabilista = context.Pessoas.SingleOrDefault(c => c.Id == CodCadastroContabilista);
                }

                return _contabilista;
            }
            set
            {
                OnPropertyChanging("CadContabilista");
                _contabilista = value;
                CodCadastroContabilista = value != null ? value.Id : (int?)null;
                OnPropertyChanged("CadContabilista");
            }
        }

        private Pessoa _responsavel = null;

        public Pessoa CadResponsavel
        {
            get
            {
                if (CodCadastroResponsavel == null)
                    return null;

                if (_responsavel == null || _responsavel.Id != CodCadastroResponsavel)
                {
                    var context = (EDMCadastro)OracleConnectionPool.GetPool().GetDbContext<EDMCadastro>();
                    _responsavel = context.Pessoas.SingleOrDefault(c => c.Id == CodCadastroResponsavel);
                }

                return _responsavel;
            }
            set
            {
                OnPropertyChanging("CadResponsavel");
                _responsavel = value;
                CodCadastroResponsavel = value != null ? value.Id : (int?)null;
                OnPropertyChanged("CadResponsavel");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string property)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(property));
            }
        }

        public event PropertyChangingEventHandler PropertyChanging;

        public void OnPropertyChanging(string property)
        {
            if (PropertyChanging != null)
            {
                PropertyChanging(this, new PropertyChangingEventArgs(property));
            }
        }

        public override string ToString()
        {
            return string.Format("({1}) {0}", DescFilial, DescIdentificacao.Replace("(", "").Replace(")", ""));
        }
    }
}
